package com.hera.base.web.vaadin;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.hera.base.util.Constantes;
import com.hera.base.util.VaadinUtil;
import com.hera.base.web.BaseUI;
import com.hera.base.web.vaadin.mantenimiento.CalendarUI;
import com.hera.base.web.vaadin.mantenimiento.DatasourceUI;
import com.hera.base.web.vaadin.mantenimiento.DepartmentUI;
import com.hera.base.web.vaadin.mantenimiento.LoginMethodUI;
import com.hera.base.web.vaadin.mantenimiento.ParameterUI;
import com.hera.base.web.vaadin.mantenimiento.ProcessGroupUI;
import com.hera.base.web.vaadin.mantenimiento.ProcessUI;
import com.hera.base.web.vaadin.mantenimiento.SecurityGroupUI;
import com.hera.base.web.vaadin.mantenimiento.SysUserUI;
import com.hera.process.config.domain.Option;
import com.hera.process.security.domain.User;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.Command;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.themes.BaseTheme;



public class PrincipalUI extends BaseUI implements Command, ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	/**
	 * 
	 */
	private static final long serialVersionUID = 4734110150296662834L;
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout mainLayoutHead;
	@AutoGenerated
	private MenuBar mnuPrincipal;
	@AutoGenerated
	private VerticalLayout lytDatosUsuario;
	@AutoGenerated
	private HorizontalLayout lytDatosUsuarioContenedor;
	@AutoGenerated
	private HorizontalLayout lytUsuario;
	@AutoGenerated
	private VerticalLayout lytCerrar;
	@AutoGenerated
	private MenuBar mnuOpciones;
	@AutoGenerated
	private Button btnCerrar;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_3;
	@AutoGenerated
	private VerticalLayout verticalLayout_3;
	@AutoGenerated
	private Label lblApellido;
	@AutoGenerated
	private Label lblUsuario;
	@AutoGenerated
	private VerticalLayout verticalLayout_2;
	@AutoGenerated
	private Label lblUsuari;
	@AutoGenerated
	private Label label_1;
	@AutoGenerated
	private HorizontalLayout lytTitulo;
	@AutoGenerated
	private Embedded imgNombre;
	@AutoGenerated
	private Label lblTitulo;
	@AutoGenerated
	private HorizontalLayout lytLogo;
	@AutoGenerated
	private Embedded imgLogo;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */

	@Autowired
	private MessageSource messageSource;

	
	private Map<String,MenuItem> mapMenu=new HashMap<String, MenuItem>();
	
	public PrincipalUI() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
	}

	public void postConstruct(){
		cargarFormulario();
		
	}



	
	private void cargarFormulario() {
		btnCerrar.setCaption(StringUtils.EMPTY);	

		btnCerrar.setIcon(new ThemeResource("images/salir.png"));
		btnCerrar.setStyleName(BaseTheme.BUTTON_LINK);
		btnCerrar.addClickListener(this);
		
		User usuario=(User)getDatoUsuarioLogin();
		HashMap<Long,List<Option>> map=usuario.getProfile().getOpciones();
		agregarMenu(Constantes.MENU.ROOT,map,null);
		lblApellido.setValue(" " + usuario.getFullName());
		lblUsuari.setValue("Usuario: ");
		lblUsuario.setVisible(false);
		label_1.setVisible(false);
		
		//mnuOpciones.setCaption("Opciones");
		//mnuOpciones.setIcon(new ThemeResource("images/edit.png"));
		
		//lytCerrar.setStyleName("buttoncust");
		mnuOpciones.setStyleName("v-menubar2");
		MenuItem mnuOpcionesB = mnuOpciones.addItem("Opciones",new ThemeResource("images/options20.png"), null);
		mnuOpcionesB.addItem("Cambiar Contraseña", new ThemeResource("images/lock-20.png"), null);
		mnuOpcionesB.addItem("Mis Datos", new ThemeResource("images/user_male20.png"), null);
		mnuOpcionesB.addItem("Salir", new ThemeResource("images/log-out-20.png"), null);
//		MenuItem mantenimiento=mnuPrincipal.addItem("Mantenimiento", null);
//		mantenimiento.addItem("PARAMETRO", this);
//		mantenimiento.addItem("DATASOURCE", this);
//		mantenimiento.addItem("GRUPO USUARIOS", this);
//		mantenimiento.addItem("PROCESO", this);
//		mantenimiento.addItem("DEPARTAMENTO", this);
//		mantenimiento.addItem("CALENDARIO", this);
//		mantenimiento.addItem("LOGINMETHOD", this);
//		mantenimiento.addItem("USUARIO", this);
//		mantenimiento.addItem("SECURITYGROUP", this);
//		mantenimiento.addItem("FIELDOPTION", this);
		
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnCerrar)){
			ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
    				.currentRequestAttributes();
    		HttpServletRequest request = requestAttributes.getRequest();
    		//HttpSession session = request.getSession(false);
    		//session.invalidate();

    		PortalLogin portalLogin=new PortalLogin();
			setCompositionRoot(portalLogin);
		}
	}
	
	private void agregarMenu(Long codigo, Map<Long, List<Option>> map, MenuItem padre) {
		if(!map.containsKey(codigo))
		{
			return;
		}
		for (Option opc : map.get(codigo)) {
			MenuItem mni=null;
			if(opc.getFather()==null||opc.getFather().getIdOpcion()==null)//ES PADRE
			{				
				mni = mnuPrincipal.addItem(opc.getName(), null);
				
			}
			else
			{
				mni = padre.addItem(opc.getName(), new OpcionMenuCommand(opc));
				mapMenu.put(opc.getIdOpcion()+"", mni);
			}
			
			if (map.get(codigo) != null) {
				agregarMenu(opc.getIdOpcion(), map, mni);
			} 
		}
	}
	
	@Override
	public void menuSelected(MenuItem selectedItem) {
		Window window=new Window();
		window.setStyleName("titulo-bold");
		
		window.setModal(false);
		window.setResizable(false);
		window.setWidth("800px");
		if(selectedItem.getText().equals("PARAMETRO")){
			if(!existeComponenteAbierto(ParameterUI.class)){
				window.setCaption("PARAMETRO");
				ParameterUI sampleUI=new ParameterUI();
				VaadinUtil.aplicarReflexionId(sampleUI);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(sampleUI);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);	
			}
		}else if(selectedItem.getText().equals("DATASOURCE")){
			if(!existeComponenteAbierto(DatasourceUI.class)){
				window.setCaption("DATASOURCE");
				DatasourceUI datasource=new DatasourceUI();
				VaadinUtil.aplicarReflexionId(datasource);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(datasource);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("330");
				window.setWidth("720");
				UI.getCurrent().addWindow(window);	
			}
		}else if(selectedItem.getText().equals("LOGINMETHOD")){
			if(!existeComponenteAbierto(LoginMethodUI.class)){
				window.setCaption("LOGINMETHOD");
				LoginMethodUI loginmethod=new LoginMethodUI();
				VaadinUtil.aplicarReflexionId(loginmethod);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(loginmethod);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);	
			}
		}
//		else if(selectedItem.getText().equals("FIELDOPTION")){
//			if(!existeComponenteAbierto(FieldOptionUI.class)){
//				window.setCaption("FIELDOPTION");
//				FieldOptionUI fieldoption=new FieldOptionUI();
//				VaadinUtil.aplicarReflexionId(fieldoption);
//				VerticalLayout layout=new VerticalLayout();
//				layout.addComponent(fieldoption);
//				layout.setMargin(true);
//				window.setContent(layout);			
//				window.setHeight("330");
//				window.setWidth("720");
//				UI.getCurrent().addWindow(window);	
//			}
//		}
		else if(selectedItem.getText().equals("SECURITYGROUP")){
			if(!existeComponenteAbierto(SecurityGroupUI.class)){
				window.setCaption("SECURITYGROUP");
				SecurityGroupUI secugroup=new SecurityGroupUI();
				VaadinUtil.aplicarReflexionId(secugroup);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(secugroup);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);	
			}
		}else if(selectedItem.getText().equals("GRUPO USUARIOS")){
			if(!existeComponenteAbierto(ProcessGroupUI.class)){
				window.setCaption("GRUPO USUARIOS");
				ProcessGroupUI proGroup=new ProcessGroupUI();
				VaadinUtil.aplicarReflexionId(proGroup);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(proGroup);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);	
			}
		}else if (selectedItem.getText().equals("CALENDARIO")) {
			if (!existeComponenteAbierto(CalendarUI.class)) {
				window.setCaption("CALENDARIO");
				CalendarUI calendar=new CalendarUI();
				VaadinUtil.aplicarReflexionId(calendar);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(calendar);
				layout.setMargin(true);
				window.setContent(layout);
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);				
			}
		}else if(selectedItem.getText().equals("DEPARTAMENTO")){
			if(!existeComponenteAbierto(DepartmentUI.class)){
				window.setCaption("DEPARTAMENTO");
				DepartmentUI deparTAMENT=new DepartmentUI();
				VaadinUtil.aplicarReflexionId(deparTAMENT);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(deparTAMENT);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);	
			}
		}else if(selectedItem.getText().equals("USUARIO")){
			if(!existeComponenteAbierto(SysUserUI.class)){
				window.setCaption("USUARIO");
				SysUserUI sysUser=new SysUserUI();
				VaadinUtil.aplicarReflexionId(sysUser);
				VerticalLayout layout=new VerticalLayout();
				layout.addComponent(sysUser);
				layout.setMargin(true);
				window.setContent(layout);			
				window.setHeight("600");
				window.setWidth("820");
				UI.getCurrent().addWindow(window);	
			}
		}
		else if(selectedItem.getText().equals("PROCESO")){
		if(!existeComponenteAbierto(ParameterUI.class)){
			window.setCaption("PROCESO");
			
			ProcessUI processUI=new ProcessUI();
			VerticalLayout layout=new VerticalLayout();
			layout.addComponent(processUI);
			layout.setMargin(true);
			window.setContent(layout);			
			window.setHeight("400");
			window.setWidth("820");
			window.addStyleName("wtitle");
			UI.getCurrent().addWindow(window);
			}
		}
	}

		
	

	
	
	private boolean existeComponenteAbierto(Class<?> clase){
		for (Window subWindow : getUI().getWindows()) {
			Component component=subWindow.getContent();
			if(clase.isInstance(component)){
				subWindow.focus();
				return true;
			}
		}
		return false;
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutHead
		mainLayoutHead = buildMainLayoutHead();
		mainLayout.addComponent(mainLayoutHead);
		
		// mainLayoutContainer
		mainLayoutContainer = new VerticalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("100.0%");
		mainLayoutContainer.setHeight("100.0%");
		mainLayoutContainer.setMargin(false);
		mainLayout.addComponent(mainLayoutContainer);
		mainLayout.setExpandRatio(mainLayoutContainer, 1.0f);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildMainLayoutHead() {
		// common part: create layout
		mainLayoutHead = new VerticalLayout();
		mainLayoutHead.setImmediate(false);
		mainLayoutHead.setWidth("100.0%");
		mainLayoutHead.setHeight("-1px");
		mainLayoutHead.setMargin(false);
		
		// lytDatosUsuario
		lytDatosUsuario = buildLytDatosUsuario();
		mainLayoutHead.addComponent(lytDatosUsuario);
		
		// mnuPrincipal
		mnuPrincipal = new MenuBar();
		mnuPrincipal.setImmediate(false);
		mnuPrincipal.setWidth("100.0%");
		mnuPrincipal.setHeight("-1px");
		mainLayoutHead.addComponent(mnuPrincipal);
		
		return mainLayoutHead;
	}

	@AutoGenerated
	private VerticalLayout buildLytDatosUsuario() {
		// common part: create layout
		lytDatosUsuario = new VerticalLayout();
		lytDatosUsuario.setImmediate(false);
		lytDatosUsuario.setWidth("100.0%");
		lytDatosUsuario.setHeight("-1px");
		lytDatosUsuario.setMargin(false);
		
		// lytDatosUsuarioContenedor
		lytDatosUsuarioContenedor = buildLytDatosUsuarioContenedor();
		lytDatosUsuario.addComponent(lytDatosUsuarioContenedor);
		
		return lytDatosUsuario;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDatosUsuarioContenedor() {
		// common part: create layout
		lytDatosUsuarioContenedor = new HorizontalLayout();
		lytDatosUsuarioContenedor.setStyleName("lytLogo");
		lytDatosUsuarioContenedor.setImmediate(false);
		lytDatosUsuarioContenedor.setWidth("100.0%");
		lytDatosUsuarioContenedor.setHeight("40px");
		lytDatosUsuarioContenedor.setMargin(false);
		
		// lytLogo
		lytLogo = buildLytLogo();
		lytDatosUsuarioContenedor.addComponent(lytLogo);
		
		// lytTitulo
		lytTitulo = buildLytTitulo();
		lytDatosUsuarioContenedor.addComponent(lytTitulo);
		lytDatosUsuarioContenedor.setExpandRatio(lytTitulo, 1.0f);
		
		// lytUsuario
		lytUsuario = buildLytUsuario();
		lytDatosUsuarioContenedor.addComponent(lytUsuario);
		
		return lytDatosUsuarioContenedor;
	}

	@AutoGenerated
	private HorizontalLayout buildLytLogo() {
		// common part: create layout
		lytLogo = new HorizontalLayout();
		lytLogo.setImmediate(false);
		lytLogo.setWidth("130px");
		lytLogo.setHeight("-1px");
		lytLogo.setMargin(false);
		
		// imgLogo
		imgLogo = new Embedded();
		imgLogo.setImmediate(false);
		imgLogo.setWidth("40px");
		imgLogo.setHeight("40px");
		imgLogo.setSource(new ThemeResource("images/logo-flexitraking.png"));
		imgLogo.setType(1);
		imgLogo.setMimeType("image/png");
		lytLogo.addComponent(imgLogo);
		
		return lytLogo;
	}

	@AutoGenerated
	private HorizontalLayout buildLytTitulo() {
		// common part: create layout
		lytTitulo = new HorizontalLayout();
		lytTitulo.setImmediate(false);
		lytTitulo.setWidth("100.0%");
		lytTitulo.setHeight("-1px");
		lytTitulo.setMargin(false);
		
		// lblTitulo
		lblTitulo = new Label();
		lblTitulo.setStyleName("titulo-principal");
		lblTitulo.setEnabled(false);
		lblTitulo.setImmediate(false);
		lblTitulo.setVisible(false);
		lblTitulo.setWidth("-1px");
		lblTitulo.setHeight("-1px");
		lblTitulo.setValue("PROCESS APLICATION");
		lytTitulo.addComponent(lblTitulo);
		lytTitulo.setComponentAlignment(lblTitulo, new Alignment(20));
		
		// imgNombre
		imgNombre = new Embedded();
		imgNombre.setImmediate(false);
		imgNombre.setWidth("-1px");
		imgNombre.setHeight("40px");
		imgNombre.setSource(new ThemeResource("images/flexitraking.png"));
		imgNombre.setType(1);
		imgNombre.setMimeType("image/png");
		lytTitulo.addComponent(imgNombre);
		lytTitulo.setComponentAlignment(imgNombre, new Alignment(20));
		
		return lytTitulo;
	}

	@AutoGenerated
	private HorizontalLayout buildLytUsuario() {
		// common part: create layout
		lytUsuario = new HorizontalLayout();
		lytUsuario.setImmediate(false);
		lytUsuario.setWidth("-1px");
		lytUsuario.setHeight("-1px");
		lytUsuario.setMargin(false);
		lytUsuario.setSpacing(true);
		
		// horizontalLayout_3
		horizontalLayout_3 = buildHorizontalLayout_3();
		lytUsuario.addComponent(horizontalLayout_3);
		lytUsuario.setComponentAlignment(horizontalLayout_3, new Alignment(33));
		
		// lytCerrar
		lytCerrar = buildLytCerrar();
		lytUsuario.addComponent(lytCerrar);
		lytUsuario.setComponentAlignment(lytCerrar, new Alignment(33));
		
		return lytUsuario;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_3() {
		// common part: create layout
		horizontalLayout_3 = new HorizontalLayout();
		horizontalLayout_3.setImmediate(false);
		horizontalLayout_3.setWidth("-1px");
		horizontalLayout_3.setHeight("-1px");
		horizontalLayout_3.setMargin(false);
		
		// verticalLayout_2
		verticalLayout_2 = buildVerticalLayout_2();
		horizontalLayout_3.addComponent(verticalLayout_2);
		horizontalLayout_3.setComponentAlignment(verticalLayout_2,
				new Alignment(33));
		
		// verticalLayout_3
		verticalLayout_3 = buildVerticalLayout_3();
		horizontalLayout_3.addComponent(verticalLayout_3);
		horizontalLayout_3.setComponentAlignment(verticalLayout_3,
				new Alignment(33));
		
		return horizontalLayout_3;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_2() {
		// common part: create layout
		verticalLayout_2 = new VerticalLayout();
		verticalLayout_2.setImmediate(false);
		verticalLayout_2.setWidth("-1px");
		verticalLayout_2.setHeight("-1px");
		verticalLayout_2.setMargin(false);
		
		// label_1
		label_1 = new Label();
		label_1.setStyleName("etiquetaCabecera");
		label_1.setEnabled(false);
		label_1.setImmediate(false);
		label_1.setVisible(false);
		label_1.setWidth("-1px");
		label_1.setHeight("20px");
		label_1.setValue("Usuario:");
		verticalLayout_2.addComponent(label_1);
		verticalLayout_2.setComponentAlignment(label_1, new Alignment(6));
		
		// lblUsuari
		lblUsuari = new Label();
		lblUsuari.setStyleName("etiquetaCabecera");
		lblUsuari.setImmediate(false);
		lblUsuari.setWidth("-1px");
		lblUsuari.setHeight("20px");
		lblUsuari.setValue("Nombre y Apellidos:");
		verticalLayout_2.addComponent(lblUsuari);
		verticalLayout_2.setComponentAlignment(lblUsuari, new Alignment(33));
		
		return verticalLayout_2;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_3() {
		// common part: create layout
		verticalLayout_3 = new VerticalLayout();
		verticalLayout_3.setImmediate(false);
		verticalLayout_3.setWidth("-1px");
		verticalLayout_3.setHeight("-1px");
		verticalLayout_3.setMargin(false);
		
		// lblUsuario
		lblUsuario = new Label();
		lblUsuario.setStyleName("valorCabecera");
		lblUsuario.setEnabled(false);
		lblUsuario.setImmediate(false);
		lblUsuario.setVisible(false);
		lblUsuario.setWidth("-1px");
		lblUsuario.setHeight("-1px");
		lblUsuario.setValue("CMONTES");
		verticalLayout_3.addComponent(lblUsuario);
		
		// lblApellido
		lblApellido = new Label();
		lblApellido.setStyleName("valorCabecera");
		lblApellido.setImmediate(false);
		lblApellido.setWidth("-1px");
		lblApellido.setHeight("-1px");
		lblApellido.setValue("Cristian Montes Pari");
		verticalLayout_3.addComponent(lblApellido);
		verticalLayout_3.setComponentAlignment(lblApellido, new Alignment(33));
		
		return verticalLayout_3;
	}

	@AutoGenerated
	private VerticalLayout buildLytCerrar() {
		// common part: create layout
		lytCerrar = new VerticalLayout();
		lytCerrar.setImmediate(false);
		lytCerrar.setWidth("-1px");
		lytCerrar.setHeight("-1px");
		lytCerrar.setMargin(false);
		
		// btnCerrar
		btnCerrar = new Button();
		btnCerrar.setCaption("Button");
		btnCerrar.setEnabled(false);
		btnCerrar.setImmediate(true);
		btnCerrar.setVisible(false);
		btnCerrar.setWidth("-1px");
		btnCerrar.setHeight("-1px");
		lytCerrar.addComponent(btnCerrar);
		
		// mnuOpciones
		mnuOpciones = new MenuBar();
		mnuOpciones.setImmediate(false);
		mnuOpciones.setWidth("-1px");
		mnuOpciones.setHeight("-1px");
		lytCerrar.addComponent(mnuOpciones);
		
		return lytCerrar;
	}

}